#version 330 core

out vec4 FragColor;
uniform sampler2D ourTexcoord;
in vec2 UV;

const float offset = 1.0 / 300.0;
void main() {
	//后期处理
	
	//1.颜色取反
//	FragColor = vec4(vec3(1.0 - texture(ourTexcoord, UV)), 1.0);
	
	//2.灰度
	FragColor = texture(ourTexcoord, UV);
	//去颜色平均值
//	float average = (FragColor.r + FragColor.g + FragColor.b) / 3.0;
	//颜色加权的(Weighted)处理 更复杂的场景中，这样的加权灰度效果会更真实一点。
	float average = 0.2126 * FragColor.r + 0.7152 * FragColor.g + 0.0722 * FragColor.b;
	FragColor = vec4(average, average, average, 1.0);
	
	//3.核效果
	/**
	 *核(Kernel)（或卷积矩阵(Convolution Matrix)）是一个类矩阵的数值数组，它的中心为当前的像素，它会用它的核值乘以周围的像素值，并将结果相加变成一个值
	 */
	vec2 offsets[9] = vec2[](
	vec2(-offset,  offset), // 左上
	vec2( 0.0f,    offset), // 正上
	vec2( offset,  offset), // 右上
	vec2(-offset,  0.0f),   // 左
	vec2( 0.0f,    0.0f),   // 中
	vec2( offset,  0.0f),   // 右
	vec2(-offset, -offset), // 左下
	vec2( 0.0f,   -offset), // 正下
	vec2( offset, -offset)  // 右下
	);
   //锐化(Sharpen)核，它会采样周围的所有像素，锐化每个颜色值
//	float kernel[9] = float[](
//	-1, -1, -1,
//	-1,  9, -1,
//	-1, -1, -1
//	);
	//模糊(Blur)效果的核是这样的
//	float kernel[9] = float[](
//	1.0 / 16, 2.0 / 16, 1.0 / 16,
//	2.0 / 16, 4.0 / 16, 2.0 / 16,
//	1.0 / 16, 2.0 / 16, 1.0 / 16
//	);
	//边缘检测 这个核高亮了所有的边缘，而暗化了其它部分
	float kernel[9] = float[](
		1, 1, 1,
		1, -8, 1,
		1, 1, 1
	);
	vec3 sampleTex[9];
	for(int i = 0; i < 9; i++)
	{
		sampleTex[i] = vec3(texture(ourTexcoord, UV.st + offsets[i]));
	}
	vec3 col = vec3(0.0);
	for(int i = 0; i < 9; i++)
	col += sampleTex[i] * kernel[i];
	
	FragColor = vec4(col, 1.0);
	
}